import { message } from 'ant-design-vue'

/**
 * 异步函数错误处理包装器
 * 用于替代 try-catch 语句
 * @param {Function} asyncFn - 异步函数
 * @returns {Promise<[Error|null, any]>} [错误, 结果]
 */
export const handleAsync = async (asyncFn) => {
  return new Promise((resolve) => {
    Promise.resolve(asyncFn())
      .then((result) => resolve([null, result]))
      .catch((error) => resolve([error, null]))
  })
}

/**
 * 统一错误处理函数
 * @param {Error} error - 错误对象
 * @param {string} defaultMessage - 默认错误信息
 */
export const handleError = (error, defaultMessage = '操作失败') => {
  console.error('错误详情:', error)

  // 根据不同错误类型显示不同消息
  if (error.name === 'AbortError') {
    // 请求被取消，不显示错误消息
    return
  }

  if (error.name === 'ValidationError') {
    message.error(error.message || '数据验证失败')
    return
  }

  if (error.name === 'NetworkError') {
    message.error('网络连接失败，请检查网络设置')
    return
  }

  // 默认错误处理
  message.error(error.message || defaultMessage)
}

/**
 * 处理API响应错误
 * @param {object} response - API响应对象
 * @returns {Error|null} 错误对象或null
 */
export const handleApiError = (response) => {
  if (!response) {
    return new Error('响应数据为空')
  }

  if (response.code !== 200) {
    return new Error(response.msg || response.message || 'API调用失败')
  }

  return null
}

/**
 * 批量处理多个异步操作
 * @param {Array<Function>} asyncFunctions - 异步函数数组
 * @returns {Promise<[Error[], any[]]>} [错误数组, 结果数组]
 */
export const handleAsyncBatch = async (asyncFunctions) => {
  const results = await Promise.allSettled(asyncFunctions.map((fn) => fn()))

  const errors = []
  const values = []

  results.forEach((result, index) => {
    if (result.status === 'rejected') {
      errors[index] = result.reason
      values[index] = null
    } else {
      errors[index] = null
      values[index] = result.value
    }
  })

  return [errors, values]
}

/**
 * 带重试机制的异步操作
 * @param {Function} asyncFn - 异步函数
 * @param {number} maxRetries - 最大重试次数
 * @param {number} delay - 重试延迟（毫秒）
 * @returns {Promise<[Error|null, any]>} [错误, 结果]
 */
export const handleAsyncWithRetry = async (asyncFn, maxRetries = 3, delay = 1000) => {
  let lastError = null

  for (let i = 0; i <= maxRetries; i++) {
    const [error, result] = await handleAsync(asyncFn)

    if (!error) {
      return [null, result]
    }

    lastError = error

    // 如果不是最后一次重试，等待一段时间后重试
    if (i < maxRetries) {
      await new Promise((resolve) => setTimeout(resolve, delay))
    }
  }

  return [lastError, null]
}
